package main

import (
	"fmt"
	"sync"
)

/*
go里没有重入锁，也就是说没法对一个已经锁上的mutex来再次上锁--这会导致程序死锁
*/
func main() {
	balance := d6_deposit(200)
	fmt.Println("交易成功，余额=", balance)
}

// 账号
var (
	// 使用互斥锁
	d6Lock sync.Mutex // guards balance
	//一个只能为1和0的信号量叫做二元信号量(binary semaphore)
	d6Balance int
)

// 存钱，内部调用查询余额，造成死锁
func d6_deposit(amount int) int {
	d6Lock.Lock()
	defer d6Lock.Unlock()

	fmt.Println("存钱->begin")
	d6Balance += amount
	fmt.Println("存钱->end")

	return d6_balance()
}

// 查询余额
func d6_balance() int {
	d6Lock.Lock()
	defer d6Lock.Unlock()

	b := d6Balance
	return b
}
